package wxk.interview.aop.core.jdk;


import wxk.interview.aop.core.jdk.handler.AbstractHandler;

import java.lang.reflect.Proxy;
import java.util.List;

/**
 * 原生jdk动态代理技术
 * <p>
 * InvocationHandler 和 Proxy.newProxyInstance()      --- 动态代理的基本原理为反射 + 多态 + 聚合
 * InvocationHandler是一个接口，通过实现该接口定义横切逻辑，并通过反射机制调用目标类的代码，动态将横切逻辑和业务逻辑编制在一起。
 * Proxy利用InvocationHandler动态创建一个符合某一接口的实例，生成目标类的代理对象
 * <p>
 * JDK动态代理要求被代理者实现一个接口，只有接口中的方法才能被代理， 其方法是，将被代理对象注入到一个中间对象，而中间对象实现InvocationHandler接口，
 * 在实现该接口时，可以在被代理对象调用它的方法时，在调用前后插入一些代码，
 * Proxy.newProxyInstance()能够利用中间对象来生产代理对象，插入的代码就是切面代码
 * 局限：
 * 被代理的对象必须实现接口，而且只有接口中的方法才能被代理
 *
 * @author wangxuekai
 * @version 1.0
 * @date 2017/3/5.
 */
public class CoreJdkDynamicProxyFactory {

    public static Object getProxy(Object target, List<AbstractHandler> handlers){

        Object proxy = target;

        if (handlers == null || handlers.isEmpty()){
            return proxy;
        }

        for (AbstractHandler handler : handlers){
            handler.setTarget(proxy);
            proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler);
        }

        return proxy;
    }
}
